<?php
declare(strict_types=1);
namespace app\api\service;
/**
 * 代码是写个人看的 在机器上能跑就行 记住这个原则 无往不利！
 */
class CommonService
{
    protected $API_KEY = "www.ccvok.com";
    public string $API_URL = '';

    public function __construct()
    {
        $this->API_URL = env('HOST_URL');
    }

    /**
     * 发送文字消息(好友或者群)
     * @access public
     * @param string $robwxid 登录账号id，用哪个账号去发送这条消息
     * @param string $to_wxid 对方的id，可以是群或者好友id
     * @param string $msg 消息内容
     */
    function send_text_msg($robwxid, $to_wxid, $msg)
    {
        $data = [
            "event" => "SendTextMsg",
            "robot_wxid" => $robwxid,
            "to_wxid" => $to_wxid,
            "member_wxid" => '',
            "member_name" => '',
            "group_wxid" => '',
            "msg" => $msg,
        ];
       return $this->sendSGHttp($this->API_URL,$data);
    }

    function invitationMessage($params,$code): \think\Response
    {
        $data = [
            "event" => "InviteInGroup",
            "robot_wxid" => $params['robot_wxid'],
            "to_wxid" => $params['from_wxid'],
            "member_wxid" => '',
            "member_name" => '',
            "group_wxid" => $code,
        ];
        return echoJson($data);
    }


    /**
     * 发送群消息并艾特某人
     * @param string $robwxid 账户id，用哪个账号去发送这条消息
     * @param string $from_wxid 群id
     * @param string $final_from_wxid 艾特的id，群成员的id ,发送消息用户的ID
     * @param string $final_from_name 艾特的昵称，群成员的昵称,发送消息用户名
     * @param string $msg 消息内容
     * $robot_wxid="hk322";    //创建这个群的人的ID
     * $from_wxid=    //群ID
     * $from_name="";    //群名称
     * $to_wxid="";    //创建这个群的人的ID
     */
    function send_group_at_msg($robwxid, $from_wxid, $final_from_wxid, $final_from_name, $msg)
    {
        $data['event'] = 'SendGroupMsgAndAt';
        $data['msg'] = $msg; // 消息内容
        $data['group_wxid'] = $from_wxid;     // 群id
        $data['member_wxid'] = $final_from_wxid;     // 艾特的id，群成员的id
        $data['to_wxid'] = $from_wxid;     // 艾特的id，群成员的id
        $data['member_name'] = $final_from_name;     // 艾特的昵称，群成员的昵称
        $data['robot_wxid'] = $robwxid;  // 账户id，用哪个账号去发送这条消息
        return $this->sendSGHttp($this->API_URL,$data);
    }

    function send_group_at_message($params, $msg)
    {
        $data['event'] = 'SendGroupMsgAndAt';
        $data['msg'] = $msg; // 消息内容
        $data['group_wxid'] = $params['from_wxid'];     // 群id
        $data['member_wxid'] = $params['final_from_wxid'];     // 艾特的id，群成员的id
        $data['to_wxid'] = $params['from_wxid'];     // 艾特的id，群成员的id
        $data['member_name'] = $params['final_from_wxid'];     // 艾特的昵称，群成员的昵称
        $data['robot_wxid'] = $params['robot_wxid'];  // 账户id，用哪个账号去发送这条消息
        return $this->sendSGHttp($this->API_URL,$data);
    }

    /**
     * 发送图片消息
     * @access public
     * @param string $robwxid 登录账号id，用哪个账号去发送这条消息
     * @param string $to_wxid 对方的id，可以是群或者好友id
     * @param string $path 图片的绝对路径 如下：
     * 1、发送网络图片,需要编码如rawurlencode('https://www.5devip.com/zb_users/theme/ccvok_zsy/image/logo1.png')
     * 2、发送本地图片，需要编码如rawurlencode('E:\Program Files\图片\1.png')
     */
    function send_image_msg($robwxid, $to_wxid, $path)
    {
        $data = array();
        $data['type'] = 103;             // Api数值（可以参考 - api列表demo）
        $data['msg'] = rawurlencode($path);           // 发送的图片的绝对路径
        $data['to_wxid'] = $to_wxid;     // 对方id
        $data['robot_wxid'] = $robwxid;  // 账户id，用哪个账号去发送这条消息
        return $this->sendSGHttp($this->API_URL, $data, 'post');
    }

    /**
     * 发送视频消息
     * @access public
     * @param string $robwxid 账户id，用哪个账号去发送这条消息
     * @param string $to_wxid 对方的id，可以是群或者好友id
     * @param string $path 视频的绝对路径 （参考图片）
     * @return string json_string
     */
    function send_video_msg($robwxid, $to_wxid, $path)
    {
        $data = array();
        $data['type'] = 104;             // Api数值（可以参考 - api列表demo）
        $data['msg'] = rawurlencode($path);          // 发送的视频的绝对路径
        $data['to_wxid'] = $to_wxid;     // 对方id
        $data['robot_wxid'] = $robwxid;  // 账户id，用哪个账号去发送这条消息
        $response = array('data' => json_encode($data));
        $url = $this->API_URL;
        return $this->sendSGHttp($url, $response, 'post');
    }

    /**
     * 发送文件消息
     * @access public
     * @param string $robwxid 账户id，用哪个账号去发送这条消息
     * @param string $to_wxid 对方的id，可以是群或者好友id
     * @param string $path 文件的绝对路径 （参考图片）
     * @return string json_string
     */
    function send_file_msg($robwxid, $to_wxid, $path)
    {
        $data = array();
        $data['type'] = 105;             // Api数值（可以参考 - api列表demo）
        $data['msg'] = rawurlencode($path);          // 发送的文件的绝对路径
        $data['to_wxid'] = $to_wxid;     // 对方id（默认发送至来源的id，也可以发给其他人）
        $data['robot_wxid'] = $robwxid;  // 账户id，用哪个账号去发送这条消息
        $response = array('data' => json_encode($data));
        $url = $this->API_URL;
        return $this->sendSGHttp($url, $response, 'post');
    }

    /**
     * 发送动态表情
     * @access public
     * @param string $robwxid 账户id，用哪个账号去发送这条消息
     * @param string $to_wxid 对方的id，可以是群或者好友id
     * @param string $path 动态表情文件（通常是gif）的绝对路径 （发送图片消息一样）
     * 1、发送网络图片,需要编码如rawurlencode('https://www.5devip.com/logo1.gif')
     * 2、发送动态表情文件,需要编码如rawurlencode('http://emoji.qpic.cn/wx_emoji/QpbHpO8M3AxldnGM8OgZSibX3vEAGwJDtiaEh6ceX2g0PFrOJJA1wibLVtIOa5m5ZJu/')
     * 3、发送本地图片，需要编码如rawurlencode('E:\Program Files\图片\1.gif')
     */
    function send_emoji_msg($robwxid, $to_wxid, $path)
    {
        $data = array();
        $data['type'] = 106;             // Api数值（可以参考 - api列表demo）
        $data['msg'] = rawurlencode($path);          // 发送的动态表情的绝对路径
        $data['to_wxid'] = $to_wxid;     // 对方id（默认发送至来源的id，也可以发给其他人）
        $data['robot_wxid'] = $robwxid;  // 账户id，用哪个账号去发送这条消息
        $response = array('data' => json_encode($data));
        $url = $this->API_URL;
        return $this->sendSGHttp($url, $response, 'post');
    }

    /**
     * 发送分享链接
     * @access public
     * @param string $robwxid 账户id，用哪个账号去发送这条消息
     * @param string $to_wxid 对方的id，可以是群或者好友id
     * @param string $title 链接标题
     * @param string $text 链接内容
     * @param string $target_url 跳转链接 允许空参数
     * @param string $pic_url 图片链接 允许空参数
     * @param string $icon_url ;  图标的链接 允收空参数
     * @return string json_string
     */
    function send_link_msg($robwxid, $to_wxid, $title, $text, $target_url, $pic_url, $icon_url)
    {
        // 封装链接结构体
        $data = array();
        $data['type'] = 107;
        $data['event'] = 'SendLinkMsg';
        $data['msg']['title'] = $title;
        $data['msg']['text'] = $text;
        $data['msg']['target_url'] = $target_url;
        $data['msg']['pic_url'] = $pic_url;
        $data['msg']['icon_url'] = $icon_url;   // 图标的链接
        $data['to_wxid'] = $to_wxid;     // 对方id（默认发送至来源的id，也可以发给其他人）
        $data['robot_wxid'] = $robwxid;  // 账户id，用哪个账号去发送这条消息
        $url = $this->API_URL;
        return $this->sendSGHttp($url, $data,);
    }

    /**
     * 发送音乐分享
     * @access public
     * @param string $robwxid 账户id，用哪个账号去发送这条消息
     * @param string $to_wxid 对方的id，可以是群或者好友id
     * @param string $name 歌曲名字
     * @return string json_string
     */
    function send_music_msg($robwxid, $to_wxid, $name)
    {
        $data['event'] = 'SendMusicMsg';             // Api数值（可以参考 - api列表demo）
        $data['msg'] = ['name' => $name, 'type' => 0];           // 歌曲名字
        $data['to_wxid'] = $to_wxid;     // 对方id（默认发送至来源的id，也可以发给其他人）
        $data['robot_wxid'] = $robwxid;  // 账户id，用哪个账号去发送这条消息
        $url = $this->API_URL;
        return $this->sendSGHttp($url, $data);
    }

    /**
     * 取指定登录账号的昵称
     * @access public
     * @param string $robwxid 账户id
     * @return string 账号昵称
     */
    function get_robot_name($robwxid)
    {
        $data = array();
        $data['type'] = 201;             // Api数值（可以参考 - api列表demo）
        $data['robot_wxid'] = $robwxid;  // 账户id
        $response = array('data' => json_encode($data));
        $url = $this->API_URL;
        return $this->sendSGHttp($url, $response, 'post');
    }

    /**
     * 取指定登录账号的头像    (限测版 失败)
     * @access public
     * @param string $robwxid 账户id
     * @return string 头像http地址
     */
    function get_robot_headimgurl($robwxid)
    {
        $data = array();
        $data['type'] = 202;             // Api数值（可以参考 - api列表demo）
        $data['robot_wxid'] = $robwxid;  // 账户id
        $response = array('data' => json_encode($data));
        $url = $this->API_URL;
        return $this->sendSGHttp($url, $response, 'post');
    }

    /**
     * 取登录账号列表
     * @access public
     * @param string $robwxid 账户id
     * @return string 当前框架已登录的账号信息列表
     * 可以获取到名称，图片，微信号等
     */
    function get_logged_account_list()
    {
        $data = array();
        $data['type'] = 203;             // Api数值（可以参考 - api列表demo）
        $response = array('data' => json_encode($data));
        $url = $this->API_URL;
        return $this->sendSGHttp($url, $response, 'post');
    }

    /**
     * 取好友列表(只能获取到数量)
     * @access public
     * @param string $robwxid 账户id
     * @param string $is_refresh 是否刷新
     * @return string 当前框架已登录的账号信息列表
     */
    function get_friend_list($robwxid = '', $is_refresh = 0)
    {

        $data['event'] = 'GetFriendList';                // Api数值（可以参考 - api列表demo）
        $data['robot_wxid'] = $robwxid;     // 账户id（可选，如果填空字符串，即取所有登录账号的好友列表，反正取指定账号的列表）
        $data['is_refresh'] = $is_refresh;  // 是否刷新列表，0 从缓存获取 / 1 刷新并获取
        $url = $this->API_URL;
        return $this->sendSGHttp($url, $data);
    }

    /**
     * 取群聊列表 (只能获取到群数量)
     * @access public
     * @param string $robwxid 账户id
     * @param string $is_refresh 是否刷新
     * @return string 当前框架已登录的账号信息列表
     */
    function get_group_list($robwxid = '', $is_refresh = 0)
    {
        $data['event'] = 'GetGroupList';
        $data['type'] = 205;                // Api数值（可以参考 - api列表demo）
        $data['robot_wxid'] = $robwxid;     // 账户id（可选，如果填空字符串，即取所有登录账号的好友列表，反正取指定账号的列表）
        $data['is_refresh'] = $is_refresh;  // 是否刷新列表，0 从缓存获取 / 1 刷新并获取
        $url = $this->API_URL;
        return $this->sendSGHttp($url, $data,);
    }

    /**
     * 取群成员列表，获取群有多少个人(只能获取到群数量)
     * @access public
     * @param string $robwxid 账户id
     * @param string $group_wxid 群id
     * @param string $is_refresh 是否刷新
     * @return string 当前框架已登录的账号信息列表
     */
    function get_group_member_list($robwxid, $group_wxid, $is_refresh = 0)
    {
        $data['event'] = 'GetGroupMemberList';
        $data['type'] = 206;                // Api数值（可以参考 - api列表demo）
        $data['robot_wxid'] = $robwxid;     // 账户id
        $data['group_wxid'] = $group_wxid;  // 群id
        $data['is_refresh'] = $is_refresh;  // 是否刷新列表，0 从缓存获取 / 1 刷新并获取
        $url = $this->API_URL;
        return $this->sendSGHttp($url, $data, );
    }

    /**
     * 取群成员资料（限测版 失败）
     * @access public
     * @param string $robwxid 账户id
     * @param string $group_wxid 群id
     * @param string $member_wxid 群成员id
     * @return string json_string
     */
    function get_group_member($robwxid, $group_wxid, $member_wxid)
    {
        $data = array();
        $data['type'] = 207;                  // Api数值（可以参考 - api列表demo）
        $data['robot_wxid'] = $robwxid;       // 账户id，取哪个账号的资料
        $data['group_wxid'] = $group_wxid;    // 群id
        $data['member_wxid'] = $member_wxid;  // 群成员id
        $response = array('data' => json_encode($data));
        $url = $this->API_URL;
        return $this->sendSGHttp($url, $response, 'post');
    }

    /**
     * 接收好友转账 (未测试)
     * @access public
     * @param string $robwxid 账户id
     * @param string $friend_wxid 朋友id
     * @param string $json_string 转账事件原消息
     * @return string json_string
     */
    function accept_transfer($robwxid, $friend_wxid, $json_string)
    {
        $data = array();
        $data['type'] = 301;                  // Api数值（可以参考 - api列表demo）
        $data['robot_wxid'] = $robwxid;      // 账户id
        $data['friend_wxid'] = $friend_wxid;  // 朋友id
        $data['msg'] = $json_string;         // 转账事件原消息
        $response = array('data' => json_encode($data));
        $url = $this->API_URL;
        return $this->sendSGHttp($url, $response, 'post');
    }

    /**
     * 同意群聊邀请 (未测试 限测版)
     * @access public
     * @param string $robwxid 账户id
     * @param string $json_string 同步消息事件中群聊邀请原消息
     * @return string json_string
     */
    function agree_group_invite($robwxid, $json_string)
    {
        $data['event'] = 'AgreeGroupInvite';                  // Api数值（可以参考 - api列表demo）
        $data['type'] = 302;                  // Api数值（可以参考 - api列表demo）
        $data['robot_wxid'] = $robwxid;      // 账户id
        $data['msg'] = $json_string;         // 同步消息事件中群聊邀请原消息
        $url = $this->API_URL;
        return $this->sendSGHttp($url, $data, 'post');
    }

    /**
     * 同意好友请求 (未测试)
     * @access public
     * @param string $robwxid 账户id
     * @param string $json_string 好友请求事件中原消息
     * @return string json_string
     */
    function agree_friend_verify($robwxid, $json_string)
    {
        $data = array();
        $data['type'] = 303;                  // Api数值（可以参考 - api列表demo）
        $data['robot_wxid'] = $robwxid;      // 账户id
        $data['msg'] = $json_string;         // 好友请求事件中原消息
        $response = array('data' => json_encode($data));
        $url = $this->API_URL;
        return $this->sendSGHttp($url, $response, 'post');
    }

    /**
     * 修改好友备注
     * @access public
     * @param string $robwxid 账户id
     * @param string $friend_wxid 好友id
     * @param string $note 新备注（空字符串则是删除备注）
     * @return string json_string
     */
    function modify_friend_note($robwxid, $friend_wxid, $note)
    {
        $data = array();
        $data['type'] = 304;                  // Api数值（可以参考 - api列表demo）
        $data['robot_wxid'] = $robwxid;      // 账户id
        $data['friend_wxid'] = $friend_wxid;  // 朋友id
        $data['msg'] = $note;               // 新备注（空字符串则是删除备注）
        $response = array('data' => json_encode($data));
        $url = $this->API_URL;
        return $this->sendSGHttp($url, $response, 'post');
    }

    /**
     * 删除好友 (未测试 限测版)
     * @access public
     * @param string $robwxid 账户id
     * @param string $friend_wxid 好友id
     * @return string json_string
     */
    function delete_friend($robwxid, $friend_wxid)
    {
        $data = array();
        $data['type'] = 305;                  // Api数值（可以参考 - api列表demo）
        $data['robot_wxid'] = $robwxid;      // 账户id
        $data['friend_wxid'] = $friend_wxid;  // 朋友id
        $response = array('data' => json_encode($data));
        $url = $this->API_URL;
        return $this->sendSGHttp($url, $response, 'post');
    }

    /**
     * 踢出群成员 (未测试)
     * @access public
     * @param string $robwxid 账户id
     * @param string $group_wxid 群id
     * @param string $member_wxid 群成员id
     * @return string json_string
     */
    function remove_group_member($robwxid, $group_wxid, $member_wxid)
    {
        $data = array();
        $data['type'] = 306;                  // Api数值（可以参考 - api列表demo）
        $data['robot_wxid'] = $robwxid;      // 账户id
        $data['group_wxid'] = $group_wxid;  // 群id
        $data['member_wxid'] = $member_wxid;  // 群成员id
        $response = array('data' => json_encode($data));
        $url = $this->API_URL;
        return $this->sendSGHttp($url, $response, 'post');
    }

    /**
     * 修改群名称
     * @access public
     * @param string $robwxid 账户id
     * @param string $group_wxid 群id
     * @param string $group_name 新群名
     * @return string json_string
     */
    function modify_group_name($robwxid, $group_wxid, $group_name)
    {
        $data = array();
        $data['type'] = 307;                  // Api数值（可以参考 - api列表demo）
        $data['robot_wxid'] = $robwxid;      // 账户id
        $data['group_wxid'] = $group_wxid;  // 群id
        $data['group_name'] = $group_name;   // 新群名
        $response = array('data' => json_encode($data));
        $url = $this->API_URL;
        return $this->sendSGHttp($url, $response, 'post');
    }

    /**
     * 修改群公告
     * @access public
     * @param string $robwxid 账户id
     * @param string $group_wxid 群id
     * @param string $notice 新公告
     * @return string json_string
     */
    function modify_group_notice($robwxid, $group_wxid, $content)
    {
        $data = array();
        $data['type'] = 308;                  // Api数值（可以参考 - api列表demo）
        $data['robot_wxid'] = $robwxid;      // 账户id
        $data['group_wxid'] = $group_wxid;  // 群id
        $data['content'] = $content;       // 新公告
        $response = array('data' => json_encode($data));
        $url = $this->API_URL;
        return $this->sendSGHttp($url, $response, 'post');
    }

    /**
     * 建立新群 (未测试 限测版)
     * @access public
     * @param string $robwxid 账户id
     * @param array $friends 三个人及以上的好友id数组，['wxid_1xxx', 'wxid_2xxx', 'wxid_3xxx', 'wxid_4xxx']
     * @return string json_string
     */
    function building_group($robwxid, $friends)
    {
        $data = array();
        $data['type'] = 309;              // Api数值（可以参考 - api列表demo）
        $data['robot_wxid'] = $robwxid;  // 账户id
        $data['friends'] = $friends;  // 好友id数组
        $response = array('data' => json_encode($data));
        $url = $this->API_URL;
        return $this->sendSGHttp($url, $response, 'post');
    }

    /**
     * 退出群聊    (限测版 失败)
     * @access public
     * @param string $robwxid 账户id
     * @param string $group_wxid 群id
     * @return string json_string
     */
    function quit_group($robwxid, $group_wxid)
    {
        $data = array();
        $data['type'] = 310;                // Api数值（可以参考 - api列表demo）
        $data['robot_wxid'] = $robwxid;    // 账户id
        $data['group_wxid'] = $group_wxid; // 群id
        $response = array('data' => json_encode($data));
        $url = $this->API_URL;
        return $this->sendSGHttp($url, $response, 'post');
    }

    /**
     * 邀请加入群聊
     * @access public
     * @param string $robwxid 账户id
     * @param string $group_wxid 群id
     * @param string $friend_wxid 要邀请的好友ID
     * @return string json_string
     */
    function invite_in_group($robwxid, $group_wxid, $friend_wxid)
    {
        $data['event'] = 'InviteInGroup';                  // Api数值（可以参考 - api列表demo）
        $data['type'] = 311;                  // Api数值（可以参考 - api列表demo）
        $data['robot_wxid'] = $robwxid;     // 账户id
        $data['group_wxid'] = $group_wxid;  // 群id
        $data['to_wxid'] = $friend_wxid; // 要邀请的好友ID
        $url = $this->API_URL;
        return $this->sendSGHttp($url, $data);
    }

    /**
     * 执行一个 HTTP 请求，仅仅是post组件，其他语言请自行替换即可
     * @param string $url 执行请求的url地址
     * @param mixed $params 表单参数
     * @param int $timeout 超时时间
     * @param string $method 请求方法 post / get
     */
    function sendSGHttp($url, $params, $method = 'POST', $timeout = 3)
    {
        if (null == $url) return null;
        $curl = curl_init();
        if ('get' == $method) {//以GET方式发送请求
            curl_setopt($curl, CURLOPT_URL, "{$url}?{$params}");
        } else {//以POST方式发送请求
            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_POST, 1);//post提交方式
            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($params));//设置传送的参数
        }
        curl_setopt($curl, CURLOPT_HEADER, false);//设置header
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);//要求结果为字符串且输出到屏幕上
        curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, $timeout);//设置等待时间
        $res = curl_exec($curl);//运行curl
        $err = curl_error($curl);
        if (false === $res || !empty($err)) {
            $Errno = curl_errno($curl);
            $Info = curl_getinfo($curl);
            curl_close($curl);
            //print_r($Info);
            return $err . ' result: ' . $res . 'error_msg: ' . $Errno;
        }
        curl_close($curl);//关闭curl
        return $res;
    }


}